#include "String.h"

//#define  MAX_INT  2147483648l

//class Solution {
//public:
//    bool isSame1(char ch)
//    {
//        if (ch == ' ' || (ch >= '0' && ch <= '9')||ch=='-'||ch=='+') return true;
//        else return false;
//    }
//
//    bool isSame2(char ch)
//    {
//        if (ch == ' ' || (ch >= '0' && ch <= '9')) return true;
//        else return false;
//    }
//
//    int myAtoi(string str) {
//        string s;
//        int flag1 = 0;
//        int flag2 = 0;
//        for (int i = 0; i < str.size(); i++)
//        {
//            if (!isSame1(str[i]) && flag1 == 0) break; //不能包含+ -
//            if (!isSame2(str[i]) && flag1 == 1) break; //排除 + -
//
//            if (flag1 == 0) 
//            {
//                if (str[i] == '+') flag2 == 1, flag1 = 1;
//                if (str[i] == '-') flag2 = -1, flag1 = 1; //判断负数
//            }
//
//            if (str[i] >= '0' && str[i] <= '9') //找到第一个数字
//            {
//                s += str[i];
//            }
//        }
//        cout << s << endl;
//        long long cnt = 0;
//        for (int i = 0; i < s.size(); i++)
//        {
//            cnt = cnt * 10 + (s[i] - '0');
//            if (cnt > MAX_INT) return flag2 == -1 ? -MAX_INT : MAX_INT - 1;
//        }
//        if (flag2 == 0) flag2 = 1;
//        return (int)cnt * flag2;
//    }
//};


class Solution {
public:
   int myAtoi(string str) {
       int sign = 1;   //默认为正数
       //先舍弃开头可能存在的空格
       int i = 0;
       while (i < str.size() && str[i] == ' ') i++;
       if (str[i] == '-') {
           sign = -1;  //该字符串片段为负数
           i++;          //移至下一个字符接着判断
       }

       else if (str[i] == '+') i++;   //如果首个字符为‘+’则sign已经默认为 1 无须更改，直接移动到下一位即可

       //下面开始对非正负符号位进行判断

       //如果第一个正负号字符后的首个字符就不是数字字符(也可能第一个字符就不是正负号)，那么直接返回0
       if (str[i] < '0' || str[i] > '9') return 0;
       long long res = 0;
       int num;      //用来单独存储单个字符转换而成的数字
       int border = INT_MAX / 10;  //用来验证计算结果是否溢出int范围的数据

       while (i < str.size()) {
           if (str[i] < '0' || str[i] > '9') break;  //遇到非数字字符则返回已经计算的res结果
           if (res > border || res == border && str[i] > '7')  //注意这句话要放在字符转换前，因为需要验证的位数比实际值的位数要少一位
               //这里比较巧妙的地方在于 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 2. 将超过最大值和低于最小值的情况都包括了
               return sign == 1 ? INT_MAX : INT_MIN;
           //开始对数字字符进行转换
           num = str[i] - '0';
           res = res * 10 + num;
           i++;
       }
       //最后结果根据符号添加正负号
       return (int)res * sign;

   }
};


//int main()
//{
//    string s1;
//    getline(cin, s1);
//    Solution S;
//    int sum = S.myAtoi(s1);
//
//    cout << sum << endl;
//}